home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / gtlayout-source.lha / LT_GetAttributes.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  9.3 KB  |  484 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. LONG __stdargs
  15. LT_GetAttributes(LayoutHandle *Handle,LONG ID,...)
  16. {
  17.     va_list VarArgs;
  18.     LONG    Result;
  19.  
  20.     va_start(VarArgs,ID);
  21.     Result = LT_GetAttributesA(Handle,ID,(struct TagItem *)VarArgs);
  22.     va_end(VarArgs);
  23.  
  24.     return(Result);
  25. }
  26.  
  27.  
  28. /*****************************************************************************/
  29.  
  30.  
  31. /****** gtlayout.library/LT_GetAttributesA ******************************************
  32. *
  33. *   NAME
  34. *    LT_GetAttributesA -- Inquire information on a gadget.
  35. *
  36. *   SYNOPSIS
  37. *    Value = LT_GetAttributesA(Handle,ID,Tags);
  38. *      D0                        A0   D0  A1
  39. *
  40. *    LONG LT_GetAttributesA(LayoutHandle *,LONG ID,struct TagItem *);
  41. *
  42. *    Value = LT_GetAttributes(Handle,ID,...);
  43. *
  44. *    LONG LT_GetAttributes(LayoutHandle *,LONG ID,...);
  45. *
  46. *   FUNCTION
  47. *    All objects created by the user interface layout code posess
  48. *    certain unique properties. The LT_GetAttributes() function will
  49. *    will inquire this information and return it. The implementation
  50. *    differs from gadtools.library/GT_GetGadgetAttrs in that you
  51. *    can inquire only a small subset of the object properties possible
  52. *    via the taglist passed in.
  53. *
  54. *   INPUTS
  55. *    Handle - Pointer to LayoutHandle structure.
  56. *
  57. *    ID - ID number of the object to inquire information about. This
  58. *        is the same value you passed via LA_ID to LT_New() when
  59. *        you created this object.
  60. *
  61. *    Tags - TagItem list to receive information about the object
  62. *        in question.
  63. *
  64. *
  65. *    LA_Left (LONG *) - Left edge of object.
  66. *
  67. *    LA_Top (LONG *) - Top edge of object.
  68. *
  69. *    LA_Width (LONG *) - Width of object.
  70. *
  71. *    LA_Height (LONG *) - Height of object.
  72. *
  73. *    LA_Chars (LONG *) - Width of object measured in character
  74. *        widths.
  75. *        (requires gtlayout.library v9 or higher)
  76. *
  77. *    LA_Lines (LONG *) - Height of object measured in character
  78. *        heights.
  79. *        (requires gtlayout.library v9 or higher)
  80. *
  81. *    LA_LabelLeft (LONG *) - Left edge of label text.
  82. *        (requires gtlayout.library v9 or higher)
  83. *
  84. *    LA_LabelTop (LONG *) - Top edge of label text.
  85. *        (requires gtlayout.library v9 or higher)
  86. *
  87. *    LABO_Object (Object *) - Returns a pointer to the BOOPSI object
  88. *        the BOOPSI_KIND object is based upon.
  89. *
  90. *            NOTE: Don't unlink the object or dispose of it or
  91. *                terrible things are bound to happen.
  92. *
  93. *        (requires gtlayout.library v10 or higher)
  94. *
  95. *   RESULT
  96. *    The result depends on the object type:
  97. *
  98. *        VERTICAL_KIND:
  99. *        HORIZONTAL_KIND:
  100. *
  101. *            active page
  102. *
  103. *        FRACTION_KIND:
  104. *
  105. *            current LAFC_Number value
  106. *
  107. *        SCROLLER_KIND:
  108. *
  109. *            current GTSC_Top value
  110. *
  111. *        TAPEDECK_KIND:
  112. *
  113. *            current LATD_Pressed value
  114. *
  115. *        LEVEL_KIND:
  116. *
  117. *            current LAVL_Level state
  118. *
  119. *        CHECKBOX_KIND:
  120. *
  121. *            current GTCB_Checked state
  122. *
  123. *        LISTVIEW_KIND:
  124. *
  125. *            current GTLV_Selected state
  126. *
  127. *        MX_KIND:
  128. *
  129. *            current GTMX_Active state
  130. *
  131. *        CYCLE_KIND:
  132. *
  133. *            current GTCY_Active state
  134. *
  135. *        POPUP_KIND:
  136. *
  137. *            current LAPU_Active state
  138. *
  139. *        TAB_KIND:
  140. *
  141. *            current LATB_Active state
  142. *
  143. *        PALETTE_KIND:
  144. *
  145. *            current GTPA_Color state
  146. *
  147. *        SLIDER_KIND:
  148. *
  149. *            current GTSL_Level state
  150. *
  151. *        GAUGE_KIND:
  152. *
  153. *            current LAGA_Percent state
  154. *
  155. *        STRING_KIND:
  156. *
  157. *            pointer to current string
  158. *
  159. *        PASSWORD_KIND:
  160. *
  161. *            pointer to current string
  162. *
  163. *        INTEGER_KIND:
  164. *
  165. *            number currently entered
  166. *
  167. *        BOOPSI_KIND:
  168. *
  169. *            whatever the object thinks is its
  170. *            current value
  171. *
  172. ******************************************************************************
  173. *
  174. */
  175.  
  176. LONG LIBENT
  177. LT_GetAttributesA(_REG(a0) LayoutHandle *Handle,_REG(d0) LONG ID,_REG(a1) struct TagItem *TagList)
  178. {
  179.     if(Handle)
  180.     {
  181.         struct TagItem    *ThisTag;
  182.         ObjectNode        *Node = NULL;
  183.  
  184.         if(ThisTag = FindTagItem(LAPR_Gadget,TagList))
  185.             Node = ((struct Gadget *)ThisTag->ti_Data)->UserData;
  186.  
  187.         if(!Node)
  188.         {
  189.             if(ThisTag = FindTagItem(LAPR_Object,TagList))
  190.                 Node = (ObjectNode *)ThisTag->ti_Data;
  191.         }
  192.  
  193.         if(!Node)
  194.             Node = LTP_FindNode(Handle,ID);
  195.  
  196.         if(Node)
  197.         {
  198.             struct Gadget *Gadget = Node->Host;
  199.  
  200.             if(TagList)
  201.             {
  202.                 struct TagItem    *TagItem,
  203.                                 *TempPtr = TagList;
  204.                 LONG            *Value;
  205.  
  206.                 while(TagItem = NextTagItem(&TempPtr))
  207.                 {
  208.                     Value = (LONG *)TagItem->ti_Data;
  209.  
  210.                     switch(TagItem->ti_Tag)
  211.                     {
  212.                         case LA_Left:
  213.  
  214.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  215.                                 *Value = Node->Left + 4;
  216.                             else
  217.                                 *Value = Node->Left;
  218.  
  219.                             break;
  220.  
  221.                         case LA_Top:
  222.  
  223.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  224.                                 *Value = Node->Top + 2;
  225.                             else
  226.                                 *Value = Node->Top;
  227.  
  228.                             break;
  229.  
  230.                         case LA_Width:
  231.  
  232.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  233.                                 *Value = Node->Width - 8;
  234.                             else
  235.                                 *Value = Node->Width;
  236.  
  237.                             break;
  238.  
  239.                         case LA_Height:
  240.  
  241.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  242.                                 *Value = Node->Height - 4;
  243.                             else
  244.                                 *Value = Node->Height;
  245.  
  246.                             break;
  247.  
  248. #ifdef DO_BOOPSI_KIND
  249.                         case LABO_Object:
  250.  
  251.                             if(Node->Type == BOOPSI_KIND)
  252.                                 *Value = (LONG)Node->Host;
  253.                             else
  254.                                 *Value = NULL;
  255.  
  256.                             break;
  257. #endif    /* DO_BOOPSI_KIND */
  258.                         case LA_Chars:
  259.  
  260.                             *Value = Node->Chars;
  261.                             break;
  262.  
  263.                         case LA_Lines:
  264.  
  265.                             *Value = Node->Lines;
  266.                             break;
  267.  
  268.                         case LA_LabelLeft:
  269.  
  270.                             switch(Node->LabelPlace)
  271.                             {
  272.                                 case PLACE_LEFT:
  273.  
  274.                                     *Value    = Node->Left - (INTERWIDTH + Node->LabelWidth);
  275.                                     break;
  276.  
  277.                                 case PLACE_RIGHT:
  278.  
  279.                                     *Value    = Node->Left + Node->Width + INTERWIDTH;
  280.                                     break;
  281.  
  282.                                 case PLACE_ABOVE:
  283.  
  284.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  285.                                     break;
  286.  
  287.                                 case PLACE_BELOW:
  288.  
  289.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  290.                                     break;
  291.  
  292.                                 case PLACE_IN:
  293.  
  294.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  295.                                     break;
  296.                             }
  297.  
  298.                             break;
  299.  
  300.                         case LA_LabelTop:
  301.  
  302.                             switch(Node->LabelPlace)
  303.                             {
  304.                                 case PLACE_LEFT:
  305.  
  306.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  307.                                     break;
  308.  
  309.                                 case PLACE_RIGHT:
  310.  
  311.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  312.                                     break;
  313.  
  314.                                 case PLACE_ABOVE:
  315.  
  316.                                     *Value    = Node->Top - (Handle->GlyphHeight + INTERHEIGHT);
  317.                                     break;
  318.  
  319.                                 case PLACE_BELOW:
  320.  
  321.                                     *Value    = Node->Top + Node->Height + INTERHEIGHT;
  322.                                     break;
  323.  
  324.                                 case PLACE_IN:
  325.  
  326.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  327.                                     break;
  328.                             }
  329.  
  330.                             break;
  331.                     }
  332.                 }
  333.             }
  334.  
  335.             switch(Node->Type)
  336.             {
  337.                 case CHECKBOX_KIND:
  338.                 case LISTVIEW_KIND:
  339.                 case MX_KIND:
  340.                 case CYCLE_KIND:
  341.                 case PALETTE_KIND:
  342.                 case SLIDER_KIND:
  343.                 case SCROLLER_KIND:
  344. #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
  345.                 case POPUP_KIND:
  346. #endif
  347. #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
  348.                 case TAB_KIND:
  349. #endif
  350. #ifdef DO_GAUGE_KIND
  351.                 case GAUGE_KIND:
  352. #endif
  353. #ifdef DO_TAPEDECK_KIND
  354.                 case TAPEDECK_KIND:
  355. #endif    /* DO_TAPEDECK_KIND */
  356.                     return(Node->Current);
  357. #ifdef DO_BOOPSI_KIND
  358.                 case BOOPSI_KIND:
  359.                 {
  360.                     ULONG Storage;
  361.  
  362.                     if(Gadget && GetAttr(Node->Special.BOOPSI.TagCurrent,Gadget,&Storage))
  363.                         return((LONG)Storage);
  364.                     else
  365.                         return(NULL);
  366.                 }
  367. #endif    /* DO_BOOPSI_KIND */
  368.  
  369.                 case VERTICAL_KIND:
  370.                 case HORIZONTAL_KIND:
  371.  
  372.                     return((LONG)Node->Special.Group.ActivePage);
  373.  
  374. #ifdef DO_FRACTION_KIND
  375.                 case FRACTION_KIND:
  376.                 {
  377.                     STRPTR String;
  378.  
  379.                     if(Gadget)
  380.                         String = ((struct StringInfo *)Gadget->SpecialInfo)->Buffer;
  381.                     else
  382.                         String = Node->Special.String.String;
  383.  
  384.                     if(String)
  385.                     {
  386.                         FIXED Contents;
  387.  
  388.                         Contents = LT_String2Fixed(String);
  389.  
  390.                         if(Contents < Node->Min)
  391.                             Contents = Node->Min;
  392.                         else
  393.                         {
  394.                             if(Contents > Node->Max)
  395.                                 Contents = Node->Max;
  396.                         }
  397.  
  398.                         LT_SetAttributes(Handle,0,
  399.                             LAPR_Object,    Node,
  400.                             LAFC_Number,    Contents,
  401.                         TAG_DONE);
  402.  
  403.                         return((LONG)Contents);
  404.                     }
  405.                 }
  406.                 break;
  407. #endif
  408.  
  409. #ifdef DO_LEVEL_KIND
  410.                 case LEVEL_KIND:
  411.  
  412.                     return(Node->Special.Level.Level);
  413. #endif    /* DO_LEVEL_KIND */
  414.                 case STRING_KIND:
  415.  
  416.                     if(Gadget)
  417.                     {
  418.                         struct StringInfo *StringInfo;
  419.  
  420.                         StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  421.  
  422.                         return((LONG)StringInfo->Buffer);
  423.                     }
  424.                     else
  425.                     {
  426.                         STRPTR String = Node->Special.String.String;
  427.  
  428.                         if(!String)
  429.                             String = "";
  430.  
  431.                         return((LONG)String);
  432.                     }
  433.  
  434.                     break;
  435.  
  436. #ifdef DO_PASSWORD_KIND
  437.                 case PASSWORD_KIND:
  438.  
  439.                     return((LONG)Node->Special.String.RealString);
  440. #endif
  441.  
  442.                 case INTEGER_KIND:
  443.  
  444.                     if(Gadget)
  445.                     {
  446.                         struct StringInfo    *StringInfo;
  447.                         LONG                 Contents;
  448.  
  449.                         StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  450.  
  451.                         Contents = StringInfo->LongInt;
  452.  
  453.                         if(Contents < Node->Min)
  454.                             Contents = Node->Min;
  455.                         else
  456.                         {
  457.                             if(Contents > Node->Max)
  458.                                 Contents = Node->Max;
  459.                         }
  460.  
  461.                         LT_SetAttributes(Handle,0,
  462.                             LAPR_Object,    Node,
  463.                             GTIN_Number,    Contents,
  464.                         TAG_DONE);
  465.  
  466.                         return(Contents);
  467.                     }
  468.                     else
  469.                         return(Node->Special.Integer.Number);
  470.  
  471.                     break;
  472.  
  473.                 case GROUP_KIND:
  474.  
  475.                     return((LONG)Node->Special.Group.ActivePage);
  476.             }
  477.         }
  478.         else
  479.             return((LONG)Handle->UserData);
  480.     }
  481.  
  482.     return(NULL);
  483. }
  484.